using System.Text.Json.Serialization;

namespace dotnet_ef_admin.Src.Utilities;

// 定义一个输入项记录，包含名称和子项列表
public record InputItem(string Name, List<InputItem>? Children);

// 定义一个转换后的项记录，包含值、标签和子项列表
public record TransformedItem(
    object Value,
    string Label,
    // 如果值为 null 的时候，忽略该字段
    [property: JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
    List<TransformedItem>? Children
);

// 提供通用工具方法的静态类
public static class Utils {

    public static string ConvertToCamelCase(string str) {
        // 使用短横线分隔字符串，并对每个单词进行处理
        return string.Join("", str.Split('-')
            // 对每个单词的首字母大写，然后接上剩余部分
            .Select(word => char.ToUpper(word[0]) + word[1..]));
    }

    // 将输入数组转换为TransformedItem列表
    // arr: 待转换的原始对象数组
    // key: 用于获取每个对象值的属性名，默认为"Id"
    public static List<TransformedItem> TransformToOption(List<object> arr, string key = "Id") {
        var transformedItems = new List<TransformedItem>();

        // 遍历原始数组中的每个项
        foreach (var item in arr) {
            // 获取对象的值、名称和子项
            var value = GetPropertyValue(item, key)?.ToString() ?? "";
            var name = GetPropertyValue(item, "Name")?.ToString() ?? "";
            var children = GetPropertyValue(item, "Children") as List<object> ?? [];

            // 创建新的转换后的项，并添加到列表中
            var newItem = new TransformedItem(
                value,
                name,
                children.Count > 0 ? TransformToOption(children, key) : null
            );
            transformedItems.Add(newItem);
        }

        return transformedItems;
    }

    // 获取对象指定属性的值
    // obj: 待获取属性值的对象
    // propertyName: 属性名
    public static object? GetPropertyValue(object? obj, string propertyName) {
        return obj?.GetType().GetProperty(propertyName)?.GetValue(obj);
    }

    // // 获取对象指定属性的值
    // // obj: 待获取属性值的对象
    // // propertyName: 属性名
    // private static object? GetPropertyValue(object obj, string propertyName) {
    //     // 通过反射获取属性值
    //     var property = obj.GetType().GetProperty(propertyName);
    //     if (property == null)
    //         // 如果属性不存在，返回空字符串
    //         // Console.WriteLine($"Property '{propertyName}' not found.");
    //         return null;
    //     // 返回属性值，如果为null则返回空字符串
    //     return property.GetValue(obj, null);
    // }
}